# -*- coding:utf-8 -*-

# 实现登陆注册功能

from . import api
from flask import request, abort, current_app, jsonify, make_response, json, session, g
from iHome import redis_store, db
from iHome import constants
from iHome.models import User
from iHome.utils.response_code import RET
from iHome.utils.common import login_required


@api.route("/session")
def check_user_login():
    """
    判断用户是否登录,如果登录,返回登录的信息:用户名,用户id
    :return:
    """
    user_id = session.get("user_id")
    name = session.get("name")
    return jsonify(
        errno=RET.OK,
        errmsg="OK",
        data={
            "user_id": user_id,
            "name": name})


@api.route("/session", methods=["DELETE"])
@login_required
def logout():
    # session.clear()
    # 清除用户登录的信息
    session.pop('user_id', None)
    session.pop('name', None)
    session.pop('mobile', None)
    return jsonify(errno=RET.OK, errmsg="OK")


@api.route("/session", methods=["POST"])
def login():
    # 1.获取参数
    data_dict = request.json
    mobile = data_dict.get("mobile")
    password = data_dict.get("password")
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")
    # 2. 找到对应手机号的用户
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据错误")
    if not user:
        return jsonify(errno=RET.DATAEXIST, errmsg="用户不存在")
    # 3. 校验密码
    if not user.check_password(password):
        return jsonify(errno=RET.PWDERR, errmsg="用户名或者密码错误")
    # 4.保存登陆状态并返回结果
    session["name"] = user.name
    session["mobile"] = user.mobile
    session["user_id"] = user.id

    # 5.返回结果
    return jsonify(errno=RET.OK, errmsg="登录成功")


@api.route("/users", methods=["POST"])
def register():
    """
    1.获取参数并判断是否有值
    2.取到本地的验证码
    3.将本地验证码和传入的短信验证码进行对比,如果一样
    4.创建用户模型,并设置数据,并添加到数据库
    5.返回结果
    :return:
    """
    # 1.获取参数并判断是否有值
    data_dict = request.json
    mobile = data_dict.get("mobile")
    phonecode = data_dict.get("phonecode")
    password = data_dict.get("password")

    if not all([mobile, phonecode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    # 2.取到本地的验证码
    try:
        sms_code = redis_store.get("SMSCode_" + mobile)
        redis_store.delete("SMSCode_" + mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="本地短信验证码获取失败")

    if not sms_code:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码过期")
    # 3.将本地验证码和传入的短信验证码进行对比,如果一样
    if phonecode != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")

    # 4.创建用户模型,并设置数据,并添加到数据库
    user = User()
    # 设置数据
    user.name = mobile
    user.mobile = mobile
    user.password = password
    # 保存用户数据
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    # 保存登陆状态
    session["name"] = mobile
    session["mobile"] = mobile
    session["user_id"] = user.id

    # 5.返回结果
    return jsonify(errno=RET.OK, errmsg="注册成功")
